/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package servlets;

import beans.Calificacion;
import beans.CalificacionFacadeLocal;
import beans.Categorias;
import beans.CategoriasFacadeLocal;
import beans.Coleccionpeliculas;
import beans.ColeccionpeliculasFacadeLocal;
import beans.Peliculas;
import beans.PeliculasFacadeLocal;
import beans.Usuarios;
import beans.UsuariosFacadeLocal;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author machine
 */
public class opciones extends HttpServlet {

    
    @EJB
    CategoriasFacadeLocal misCategoriasSession;
    @EJB
    PeliculasFacadeLocal misPeliculasSession;
    @EJB
    UsuariosFacadeLocal misUsuariosSession;
    @EJB
    CalificacionFacadeLocal misCalificacionesSession;
    @EJB
    ColeccionpeliculasFacadeLocal misColeccionPeliSession;
    
    
    public HttpSession sesion = null;
    
    private String nombreUsuario;
    
    private String nombreCategoria;
    
    private Boolean registro = false;
    
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            
            sesion = request.getSession();
            
            String opcion = request.getParameter("opcion");
            
            String categoria = request.getParameter("categoria");
            
            String idVideo = request.getParameter("video");
            
            String regnewuser = request.getParameter("regnewuser");
            
            if( opcion == null )opcion="0";
            
            
            String mensaje = null;
        
            if( regnewuser != null )
            if( regnewuser.equals("1") ){
                if( registro == true ){
                    mensaje = "Bienvenido, te acabas de registrar en nuestra pagina";
                }
                else{
                    mensaje = "Tu registro no fue exitoso, verifica la informacion ingresada, es probable que ya exista un cliente registrado con ese mismo usuario.";
                }
            }
            
            String htmlLogin = retornarDatosLoguin();
            
            request.setAttribute("loginAcceso", htmlLogin);
            
            
            String calificacion = request.getParameter("calif");
            if ( calificacion != null ){
                if(calificarPelicula( idVideo, calificacion ) ){
                    request.setAttribute("mensaje", "Tu calificacion ha sido registrada.");
                }
                else{
                    request.setAttribute("mensaje", "Se presento un error al guardar tu calificaion.");
                }
            }            
            
            String snapshots = "";
            String urlVideo = "";  
            String sinopsis = "";
            String opciones = "";
            
            switch ( Integer.parseInt(opcion) ) {

                case 3 :  String coleccion = request.getParameter("coleccion");
                          if( coleccion == null ){ coleccion = "1"; }
                          String videos = retornaVideosColeccion( coleccion );
                          snapshots = snapShotPeliculas( categoria );  
                          //Categorias micategoria = new Categorias( Integer.getInteger(categoria) );
                          //String nombreCategoria = micategoria.getNombre();  
                          urlVideo = retornaUrlVideo(categoria, idVideo);  
                          sinopsis = retornarSinopsis ( categoria, idVideo );
                          opciones = retornarOpciones( categoria, idVideo, 0 );
                          
                          request.setAttribute("categorias", videos );
                          request.setAttribute("nombreCategoria", nombreCategoria );
                          request.setAttribute("snapshots", snapshots );
                          request.setAttribute("trailer", urlVideo );
                          request.setAttribute("sinopsis", sinopsis);
                          request.setAttribute("opciones", opciones);
                          request.getRequestDispatcher("index.jsp").forward(request, response); break;

                
                // Opcion de busqueda
                case 4 :  String formConsulta = retornarFormConsulta( request );
                          request.setAttribute("formConsulta", formConsulta ); 
                          
                          String respuestaConsul = respuestaConsulta( request );
                          request.setAttribute("respuesta", respuestaConsul);
                          
                          request.getRequestDispatcher("busqueda.jsp").forward(request, response);
                          break;
            
                default : if( categoria == null ){ categoria = "1"; }
                          String categorias = retornaCategoriasPeliculas();
                          snapshots = snapShotPeliculas( categoria );  
                          //Categorias micategoria = new Categorias( Integer.getInteger(categoria) );
                          //String nombreCategoria = micategoria.getNombre();  
                          urlVideo = retornaUrlVideo(categoria, idVideo);  
                          sinopsis = retornarSinopsis ( categoria, idVideo );
                          opciones = retornarOpciones( categoria, idVideo, 0 );
                          
                          request.setAttribute("categorias", categorias );
                          request.setAttribute("nombreCategoria", nombreCategoria );
                          request.setAttribute("snapshots", snapshots );
                          request.setAttribute("trailer", urlVideo );
                          request.setAttribute("sinopsis", sinopsis);
                          request.setAttribute("opciones", opciones);
                          request.getRequestDispatcher("index.jsp").forward(request, response); break;
                    
                
            }
            
            
            
            
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        String logout = request.getParameter("logout");
        
        if( logout != null ){
            if( logout.equals("1") ){
                sesion = request.getSession();
                sesion.invalidate();
            }
        }
        
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        sesion = request.getSession();
        
        String regnewuser = request.getParameter("regnewuser");
        
        if( regnewuser != null ){
           
            if( regnewuser.equals("1") ){
            
                String iden = request.getParameter("identificacion");
                String nom = request.getParameter("nombre");
                String usu = request.getParameter("usuario");
                String clave = request.getParameter("clave");
                String dir = request.getParameter("direccion");
                String tel = request.getParameter("telefono");
                String mail = request.getParameter("correo");

                Usuarios u = new Usuarios();

                u.setIdentifcacion(iden);
                u.setNombre(nom);
                u.setUsuario(usu);
                u.setClave(clave);
                u.setPerfil( Short.parseShort("1") );
                u.setDireccion(dir);
                u.setTelefono(tel);
                u.setCorreo(mail);

                misUsuariosSession.create(u);
            }
        }
        else {
            String usu, pass;
            usu = request.getParameter("user");
            pass = request.getParameter("password");

            if( usu != null && pass != null ){
                List<Usuarios> nombreUsrVal = misUsuariosSession.validarAcceso(usu, pass);

                // Validar usuario
                if( nombreUsrVal != null ){ 
                    for(  Usuarios u:nombreUsrVal ){
                        if( u.getNombre().length()>0 && sesion.getAttribute("usuario") == null)
                        //si coincide usuario y password y además no hay sesión iniciada
                        sesion.setAttribute("usuario", usu);
                        sesion.setAttribute("idusuario", u.getIdusuarios());
                        sesion.setAttribute("nusuario", u.getNombre());
                        sesion.setAttribute("perfil", u.getPerfil());
                        nombreUsuario = u.getNombre();
                        break;
                    }
                }
            }
        }
        
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    
 private String retornaCategoriasPeliculas() {
        
        String LisCategorias = "";
        List<Categorias> misCateg = misCategoriasSession.findAll();
            for ( Categorias c:misCateg ){
                if( c.getIdcategorias() < 1000 ){
                 LisCategorias += "<li><a href=\"opciones?opcion=1&categoria="+c.getIdcategorias()+"\"><span><span>"+ c.getNombre() +"</span></span></a></li>";
                }
            }
            
        return LisCategorias;
    }

 
  private String retornaVideosColeccion( String idColeccion ) {
        
        String LisVideos = "";
        List<Coleccionpeliculas> misColpel = misColeccionPeliSession.consultarVideos(idColeccion, null);
            for ( Coleccionpeliculas c:misColpel ){
                 LisVideos += "<li><a href=\"opciones?opcion=1&categoria="+c.getIdcoleccionpeliculas()+"\"><span><span>"+ c.getIdpeliculas().getTitulo() +"</span></span></a></li>";
            }
            
        return LisVideos;
    }
 
    private String snapShotPeliculas(String categoria) {
        
        String snapPeliculas = null;
        
        if( categoria == null ){
            categoria = "1";
        }
        

        List<Categorias> misC = misCategoriasSession.findAll();
        for( Categorias c:misC ){
            if( categoria.equals(c.getIdcategorias().toString()) ){
                nombreCategoria = c.getNombre();
                break;
            }
        }
        
        List<Peliculas> misPelis = misPeliculasSession.consultarPeliculasPorCategoria( categoria, null );
        
        if( misPelis != null ){
            int x = 0;
            for ( Peliculas p:misPelis ) {

                snapPeliculas += "<li><a href=\"opciones?opcion=1&categoria="+p.getIdcategorias().getIdcategorias()+"&video="+p.getIdpeliculas()+"\" rel=\"0\"><img src=\"" + p.getUrlSnapshot() + "\" title=\""+p.getTitulo()+"\" width=\"165\" height=\"81\"></a></li>";

            }
        }
        
        return snapPeliculas;
    }
    
    
    private String retornaUrlVideo( String categoria, String idVideo ) {
        
        String urlVideo = null;
        
        if( categoria == null ){
            categoria = "1";
        }
        else{
            if( idVideo == null ){
                List<Peliculas> misPelis = misPeliculasSession.consultarPeliculasPorCategoria(categoria, null);
                
                if( misPelis != null ){
                   for(  Peliculas p:misPelis ){
                       idVideo = String.valueOf(p.getIdpeliculas());
                       break;
                   }
                }
            }
        }
        
        if( idVideo == null ){
            idVideo = "1";
        }
        
        //Categorias micateg = new Categorias( Integer.getInteger(categoria) );
        
        List<Peliculas> misPelis = misPeliculasSession.consultarPeliculasPorCategoria( categoria, idVideo );
        
        if( misPelis != null )
        for ( Peliculas p:misPelis ) {
            
            urlVideo = "<li><iframe width=\"635\" height=\"323\" src=\""+  p.getUrlTrailer() + "\" frameborder=\"0\" allowfullscreen></iframe></li>";
            
        }
        
        return urlVideo;
    }    

    private String retornarSinopsis(String categoria, String idVideo) {
        
        String nombrePelicula = null;
        String sinopsisp = null;
        String calificacion = "";
        
        if( categoria == null ){
            categoria = "1";
        }
        else{
            if( idVideo == null ){
                
                List<Peliculas> misP = misPeliculasSession.consultarPeliculasPorCategoria(categoria, null);
                
                if( misP != null ){
                   for(  Peliculas p:misP ){
                       idVideo = String.valueOf(p.getIdpeliculas());
                       break;
                   }
                }
            }
        }
        
        if( idVideo == null ){
            idVideo = "1";
        }
        
        List<Peliculas> misP = misPeliculasSession.consultarPeliculasPorCategoria(categoria, idVideo);
        for( Peliculas p:misP ){
            
            nombrePelicula = p.getTitulo();
            sinopsisp = p.getSinopsis();
        
        }
        
        List<Calificacion> calificaciones = misCalificacionesSession.consultarCalificaciones(Integer.parseInt(idVideo));
        Integer valor = 0, cantidad = 0, promedio=0;
        
        if( calificaciones != null ){
            for(  Calificacion c:calificaciones ){
                valor += c.getCalificacion();
                cantidad  += 1;
            }
            if( cantidad>0 ){
                promedio = valor/cantidad;
                calificacion = cantidad+" clientes han calificado esta pelicula como <img src=\"images/calif_"+promedio+".png\">";
            }
            else{
                calificacion = "Este video aun no se ha calificado.";
            }
        }
        
        String sinopsis = "<h2>"+nombrePelicula+"</h2>\n" +
                            "<p>"+sinopsisp+"</p>" +
                            "<p><h3><center>"+calificacion+"</center></h3></p>";
        
        return sinopsis;
        
    }
    
    private String retornarOpciones(String categoria, String idVideo, Integer opcion) {
        
        String nombrePelicula = null;
        if( categoria == null ){
            categoria = "1";
        }
        else{
            if( idVideo == null ){
                List<Peliculas> misP = misPeliculasSession.consultarPeliculasPorCategoria(categoria, idVideo);
                
                if( misP != null ){
                   for(  Peliculas p:misP ){
                       idVideo = String.valueOf(p.getIdpeliculas());
                       break;
                   }
                }
            }
        }
        if( idVideo == null ){
            idVideo = "1";
        }
        
        List<Peliculas> misP = misPeliculasSession.consultarPeliculasPorCategoria(categoria, idVideo);
        for( Peliculas p:misP ){
            nombrePelicula = p.getTitulo();
        }
        
        
        
        
        String opciones = "<ul class=\"news\">\n" +
"                <li><strong><a href=\"#\">Alquilar esta pelicula</li>\n" +
"                <li><strong><a href=\"#\">Comprar esta pelicula</li>\n" +
"                <li><strong><a href=\"javascript:formCalificar('"+nombrePelicula+"', '"+opcion+"', '"+categoria+"', '"+idVideo+"', '"+sesion.getAttribute("idusuario")+"');\">Calificar esta pelicula</li>\n" +
"                <li><strong><a href=\"#\">Referir a un amigo</li>\n" +
"              </ul>";
        
        return opciones;
    }
    
    
    
     private String retornarDatosLoguin(){
    
        String htmlLogin = "";

        
        // Si no se hainiciado Sesion
        if( sesion.getAttribute("usuario") == null ){
            htmlLogin = "<h3>Acceso de Usuario</h3>"
                    + "<br>"
                    + "  <ul class=\"list\">"
                    + "<li><a id=\"abrir\" href=\"javascript:initSession();\">Iniciar Session</a></li>"
                    + "<li><a id=\"abrir\" href=\"javascript:registerUser();\">Registrarse</a></li>"
                    +"</ul>  <br>";
        }
        else{
            htmlLogin = "<h3>Bienvenido "+ sesion.getAttribute("nusuario") +"</h3>"
                    + "<br>"
                    + "  <ul class=\"list\">"
                    + "<li><a id=\"abrir\" href=\"opciones?logout=1\">Cerrar Session</a></li>";
            
            if( sesion.getAttribute("perfil") != null ){ 
                String perfilu = sesion.getAttribute("perfil").toString();
                if( perfilu.equals("2") ){
                    htmlLogin += "<li><a id=\"abrir\" href=\"peliculas.jsp\">Insertar Peliculas</a></li>";
                    htmlLogin += "<li><a id=\"abrir\" href=\"series.jsp\">Insertar Series</a></li>";
                    htmlLogin += "<li><a id=\"abrir\" href=\"colecciones.jsp\">Administrar Colecciones</a></li>";
                }
            }
            
            htmlLogin += "</ul>  <br>";
        
        }
       return htmlLogin;
    }
    
    
     
    private boolean calificarPelicula(String idVideo, String calificacion) {
        
        Peliculas p = new Peliculas( Integer.parseInt(idVideo) );
        Usuarios u = new Usuarios(Integer.parseInt( sesion.getAttribute("idusuario").toString() ) );
        
        
        Calificacion c = new Calificacion( p, u, Short.parseShort(calificacion));
       
        misCalificacionesSession.create(c);

        return true;
        //consultarCalificaciones
        
    }
     

    
    private String retornarFormConsulta( HttpServletRequest request ){
    
        String formConsulta = "";

        String categorias = "";
        String categoriasNO = "";
        
        List<Categorias> misC = misCategoriasSession.findAll();
        
        categorias += "<select name=\"categ\" ><option value=\"0\">Seleccione...</option>";
        categoriasNO += "<select name=\"categNO\" ><option  value=\"0\">Seleccione...</option>";
        for ( Categorias c:misC ) {
            categorias += "<option value = "+c.getIdcategorias()+" ";
            if( request.getParameter("categ")!= null && c.getIdcategorias() == Integer.parseInt(request.getParameter("categ")) ){
                categorias += " selected ";
            }
            categorias += ">"+ c.getNombre() +"</option>";
            categoriasNO += "<option value = "+c.getIdcategorias()+" ";
            if( request.getParameter("categNO") != null && c.getIdcategorias() == Integer.parseInt(request.getParameter("categNO")) ){
                categoriasNO += " selected ";
            }
            categoriasNO += ">"+ c.getNombre() +"</option>";
        }
        categorias += "</select>";
        categoriasNO += "</select>";
        
        String[] signos = {"<", "=", ">"};
        String ssigno = "<select name=\"condDur\">";
        String ssigno1 = "<select name=\"condCalif\">";
        for( int i = 0; i < signos.length; i++ ){
            ssigno += "<option value=\""+signos[i]+"\" ";
            ssigno1 += "<option value=\""+signos[i]+"\" ";
            if( request.getParameter("condDur") != null && request.getParameter("condDur").equals(signos[i]) ){
                ssigno += " selected ";
            }
            if( request.getParameter("condDur") != null && request.getParameter("condCalif").equals(signos[i]) ){
                ssigno1 += " selected ";
            }
            ssigno += ">"+signos[i]+"</option>";
            ssigno1 += ">"+signos[i]+"</option>";
        }
        ssigno += "</select>";
        ssigno1 += "</select>";
        
        String[] calif = {"1","2","3","4","5"};
        String scalif = "<select name=\"valorCalif\"><option value=\"0\">Seleccione...</option>";
        for( int i = 0; i < calif.length; i++ ){
            scalif += "<option value=\""+calif[i]+"\" ";
            if( request.getParameter("condDur") != null && request.getParameter("valorCalif").equals(calif[i]) ){
                scalif += " selected ";
            }
            scalif += ">"+calif[i]+"</option>";
        }
        scalif += "</select>";
        
        
        formConsulta += "<div id=\"redondeado\"><div id=\"conmargen\">"
                + "        <form id=\"form_busqueda\" name=\"form_busqueda\" action=\"opciones?opcion=4\" method=\"post\">\n" +
        "                      <label>Categoria igual a:" + categorias + "</label>"+
        "                      <label>Categoria diferente a:" + categoriasNO +"</label>"+
        "                      <label>Producido desde:<input type=\"number\" name=\"fdesde\" min=\"1960\" max=\"2014\" step=\"1\" value=\""+request.getParameter("fdesde")+"\"></label>"+
        "                      <label>Producido hasta:<input type=\"number\" name=\"fhasta\" min=\"1960\" max=\"2014\" step=\"1\" value=\""+request.getParameter("fhasta")+"\" ></label>"+
        "                      <label>Duracion "+ssigno+"<input type=\"number\" name=\"durac\" min=\"10\" max=\"500\" step=\"1\" value=\""+request.getParameter("durac")+"\" ></label>"+
        "                      <label>Calificacion "+scalif+" CantCalif: "+ssigno1+"<input type=\"number\" name=\"cantidad\" min=\"0\" max=\"500\" step=\"1\" value=\""+request.getParameter("cantidad")+"\" ></label>"+
        "                  <br>&nbsp;<input type=\"submit\" value=\"Buscar\"></form></div></div>";
        
        return formConsulta;
    }
    
    
    private String respuestaConsulta(HttpServletRequest request) {
        
        String respuestaC = "";
        
        String[] condiciones = new String[10];
        
        Integer cantConsultas = 0;
        
        if( request.getParameter("categ") != null && !request.getParameter("categ").equals("0") ){
            condiciones[0] = request.getParameter("categ");
            cantConsultas++;
        }
        if( request.getParameter("categNO") != null && !request.getParameter("categNO").equals("0") ){
            condiciones[1] = request.getParameter("categNO");
            cantConsultas++;
        }
        if( request.getParameter("fdesde") != null && request.getParameter("fdesde").length() > 0 ){
            condiciones[2] = request.getParameter("fdesde");
            cantConsultas++;
        }
        if( request.getParameter("fhasta") != null && request.getParameter("fhasta").length() > 0  ){
            condiciones[3] = request.getParameter("fhasta");
            cantConsultas++;
        }
        if( request.getParameter("durac") != null && request.getParameter("durac").length() > 0  ){
            condiciones[4] = request.getParameter("durac");
            condiciones[5] = request.getParameter("condDur");
            cantConsultas++;
        }
        if( request.getParameter("valorCalif") != null && !request.getParameter("valorCalif").equals("0")  ){
            condiciones[6] = request.getParameter("valorCalif");
            if( request.getParameter("cantidad") != null && request.getParameter("cantidad").length() > 0  ){
                condiciones[7] = request.getParameter("cantidad");
                condiciones[8] = request.getParameter("condCalif");
            }
            cantConsultas++;
        }
        
        if( cantConsultas > 0 ){
            
            /*respuestaC += "<br>Condiciones: "+condiciones[0]+" --> "+request.getParameter("categ");
            respuestaC += "<br>Condiciones: "+condiciones[1];
            respuestaC += "<br>Condiciones: "+condiciones[2];
            respuestaC += "<br>Condiciones: "+condiciones[3];
            */
            respuestaC += "<br><div id=\"redondeado\"><div id=\"conmargen\">";

            List<Peliculas> misP = misPeliculasSession.resultadoConsulta(condiciones);

            Integer encontro = 0;
            
            if( misP != null ){
               respuestaC += "<table align=\"center\" width=\"100%\"><tr><th>Titulo</th><th>Categoria</th><th>Duracion</th><th>Codigo</th></tr>"; 
               for(  Peliculas p:misP ){
                   respuestaC += "<tr><td align=\"left\"><a href=\"opcionesServlet?opcion=1&categoria="+p.getIdcategorias().getIdcategorias()+"&video="+p.getIdpeliculas()+"\" rel=\"0\">"+p.getTitulo()+"</a></td><td>"+p.getIdcategorias().getNombre()+"</td><td>"+p.getDuracion()+" Min</td><td>"+p.getIdentificador()+"</td></tr>";
                   encontro++;
               }
               respuestaC += "</table>"; 
            }
            
            if( encontro <= 0 ){
                respuestaC += "<br>No se han encontrado conicidencias con estos criterios de busqueda.";
            }
            
           
            respuestaC += "</div></div>";
            
        }
        
        return respuestaC;
        
    }
    
     
}
